package com.bilibili.server.service;

import com.bilibili.dubbo.api.db.BlackListApi;
import com.bilibili.dubbo.api.db.QuestionApi;
import com.bilibili.dubbo.api.db.SettingApi;
import com.bilibili.dubbo.api.db.UserInfoApi;
import com.bilibili.model.db.*;
import com.bilibili.model.vo.PageResult;
import com.bilibili.model.vo.SettingsVo;
import com.bilibili.model.vo.UserInfoVoAge;
import com.bilibili.server.interceptor.UserHolder;
import org.apache.commons.collections.CollectionUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author HuangRongFu
 * 2021/11/17 星期三9:19 下午
 */

@Service
public class SettingsService {

    @DubboReference
    private SettingApi settingApi;

    @DubboReference
    private QuestionApi questionApi;

    @DubboReference
    private BlackListApi blackListApi;

    @DubboReference
    private UserInfoApi userInfoApi;

    /**
     * 用户通用设置查询
     *
     * @Return: SettingsVo
     */
    public SettingsVo querySettings() {

        //首先要获取登录的用户对象
        User loginUser = UserHolder.getUser();

        //通过登录用户的id  查询用户的通知设置
        Settings settings = settingApi.findByUserId(loginUser.getId());

        //通过登录用户的id 查询登录用户的陌生人问题
        Question question = questionApi.findByUserId(loginUser.getId());

        //构建要返回的SettingsVo
        SettingsVo vo = new SettingsVo();

        //设置vo中的值
        vo.setPhone(loginUser.getMobile());

        //设置陌生人问题  如果用户设置了陌生人问题就使用 用户自己的设置 如果没有则默认设置为 你喜欢我吗?
        vo.setStrangerQuestion(null != question ? question.getTxt() : "你喜欢我吗?");

        // 如果settings为空，则不需要设置，在SettingsVo中默认都设置为true了。
        if (null != settings) {

            BeanUtils.copyProperties(settings, vo);
        }

        return vo;
    }

    /**
     * 设置陌生人问题
     *
     * @params: content
     */
    public void saveQuestions(Map<String, String> paramMap) {

        Long loginUserId = UserHolder.getUserId();

        Question question = new Question();

        question.setUserId(loginUserId);
        question.setTxt(paramMap.get("content"));

        questionApi.saveQuestions(question);
    }

    /**
     * 通用设置保存
     *
     * @param: settings
     */
    public void saveSettings(SettingsVo vo) {

        Settings pojo = new Settings();

        //赋值
        BeanUtils.copyProperties(vo, pojo);

        pojo.setUserId(UserHolder.getUserId());
        //调用api
        settingApi.saveSettings(pojo);
    }

    /**
     * 黑名单列表
     *
     * @param: page
     * @param: pageSize
     * @Return: PageResult<BlackList>
     */
    public PageResult<UserInfoVoAge> blackList(Long page, Long pageSize) {

        //要查询的黑名单列表 需要通过用户id查询
        PageResult pageResult = blackListApi.findPage(UserHolder.getUserId(), page, pageSize);

        //获取黑名单人员集合
        List<BlackList> blackList = pageResult.getItems();

        //创建一个集合 接收黑名单用户信息
        List<UserInfoVoAge> userInfoVoList = new ArrayList<>();

        //非空判断
        if(CollectionUtils.isNotEmpty(blackList)) {
            //将list集合通过流思想处理集合  获取到黑名单人员的id集合
            List<Long> ids = blackList.stream().map(BlackList::getBlackUserId).collect(Collectors.toList());

            //通过 UserInfoApi 查询补全黑名单人员id的信息
            List<UserInfo> userInfoList = userInfoApi.findByBatchIds(ids);
            for (UserInfo userInfo : userInfoList ) {

                //将数据转化为vo
                UserInfoVoAge vo = new UserInfoVoAge();

                BeanUtils.copyProperties(userInfo, vo);
                //将查询到的用户信息添加到黑名单人员信息List中
                userInfoVoList.add(vo);
            }
        }
        //构建PageResult<UserInfoVoList>
        pageResult.setItems(userInfoVoList);
        //返回给前端
        return pageResult;
    }

    /**
     * 移除黑名单
     * @param blackUserId
     */
    public void removeBlackList(Long blackUserId) {
        //1. 获取登录用户id
        Long loginUserId = UserHolder.getUserId();
        //2. 调用api移除
        blackListApi.remove(loginUserId, blackUserId);
    }
}
